package com.ruicar.afs.cloud.bizcommon.print.common;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruicar.afs.cloud.bizcommon.print.entity.ComPrintFormFieldMapping;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 打印模板参数转换
 *
 * @author pangh
 */
@UtilityClass
@Slf4j
public class TemplateJsonFmt {

    /**
     * 模板数据映射
     *
     * @param originJson
     * @param mappings
     * @return
     */
    public String fmtTemplateJson(JSONObject originJson, List<ComPrintFormFieldMapping> mappings) {

        log.info("原数据:" + originJson);
        JSONObject json = new JSONObject();
        // list 单独处理
        List<ComPrintFormFieldMapping> list = CollUtil.newArrayList();
        // 正常处理
        mappings.forEach(item -> {
            // list 处理【.】
            if (StrUtil.indexOf(item.getOriginalFieldId(), StrUtil.C_DOT) > 0) {
                list.add(item);
            }
            // add by sijun.yu 2020-8-11 对象处理【_】
            else if(StrUtil.indexOf(item.getOriginalFieldId(), StrUtil.C_UNDERLINE) > 0){
                String splitStr = StrUtil.BACKSLASH + StrUtil.UNDERLINE;
                String[] obj = item.getOriginalFieldId().split(splitStr);
                if(originJson.containsKey(obj[0]) && originJson.getJSONObject(obj[0])!=null){
                    if(originJson.getJSONObject(obj[0]).get(obj[1])!=null){
                        json.put(item.getMappingFieldId(),originJson.getJSONObject(obj[0]).get(obj[1]));
                    }else{
                        json.put(item.getMappingFieldId(),"");
                    }
                }else{
                    json.put(item.getMappingFieldId(),"");
                }
            }
            // 正常转换
            else {
                if(originJson.get(item.getOriginalFieldId())!=null){
                    json.put(item.getMappingFieldId(), originJson.get(item.getOriginalFieldId()));
                }else{
                    json.put(item.getMappingFieldId(),"");
                }
            }
        });
        // list单独处理
        fmtTemplateJsonArray(list, json, originJson);
        log.info("模板数据:" + json);
        return json.toJSONString();
    }

    /**
     * 原数据转打印模板数据（列表处理）
     *
     * @param list       模板映射
     * @param json       转换后的json
     * @param originJson 原数据
     */
    private void fmtTemplateJsonArray(List<ComPrintFormFieldMapping> list, JSONObject json, JSONObject originJson) {

        // 存放结构 {"原数据list的key":"映射list的key"}
        Map<String, String> names = CollUtil.newHashMap();
        // 存放结构 {"原数据list的key":{"原数据list里原字段的key":"映射字段的key"}}
        Map<String, Map<String, String>> result = CollUtil.newHashMap();
        // 存放结构整理，数据库中的数据是 listname.key 对应 listname.key
        String splitStr = StrUtil.BACKSLASH + StrUtil.DOT;
        list.forEach(item -> {
            if (item.getMappingFieldId().indexOf(StrUtil.DOT) > 0
                    && item.getOriginalFieldId().indexOf(StrUtil.DOT) > 0) {
                // 数据阶段处理，listName.keyName 处理成 [listName,keyName];
                String[] templateFeilds = item.getMappingFieldId().split(splitStr);
                String[] originFeilds = item.getOriginalFieldId().split(splitStr);
                // keyName 集合
                Map<String, String> map = null;
                if (result.containsKey(originFeilds[0])) {
                    map = result.get(originFeilds[0]);
                } else {
                    map = CollUtil.newHashMap();
                }
                // 整理keyName结构
                if (!map.containsKey(originFeilds[1])) {
                    map.put(originFeilds[1], templateFeilds[1]);
                }
                result.put(originFeilds[0], map);

                // 整理listName结构
                if (!names.containsKey(originFeilds[0])) {
                    names.put(originFeilds[0], templateFeilds[0]);
                }
            }
        });

        // 从原数据中获取json数据处理成模板需要的数据
        names.forEach((oname, tname) -> {
            // 取出需要转换的数据集
            JSONArray odata = originJson.getJSONArray(oname);
            // 取出需要转换的每行数据结构
            Map<String, String> colMap = result.get(oname);
            // 过滤掉不需要的字段
            JSONArray ojson = odata.stream().map(o -> {
                JSONObject jo = (JSONObject) o;
                JSONObject njo = new JSONObject();
                colMap.forEach((k, v) -> {
                    // 用模板映射字段存值
                    njo.put(v, jo.get(k));
                });
                return njo;
            }).collect(Collectors.toCollection(JSONArray::new));
            // 追加模板数据
            json.put(tname, ojson);
        });
    }

}
